# 函数的初体验
"""
函数:是组织好的，可重复使用的，用来实现特定功能的代码段
name = "andong"
length = len(name)
print(length)

str1 = "yangkegecc"
str2 = "shjkoddnjviio"
str3 = "dfhjvhbfvobnbi"


def my_len(date):
    count = 0
    for i in date:
        count += 1
    print(f"字符串{date}的长度为{count}")
my_len(str1)
my_len(str2)
my_len(str3)
"""

# 函数的基础定义
"""
函数的定义：
def 函数名（传入参数）
    函数体
    return 返回值
def mt_name():
    print("hi,我是黑马程序员")
# 调用函数
mt_name()
函数的调用：
    函数名(参数)

1.参数如不需要，可以省略(后续章节讲解)
2.返回值如不需要，可以省略(后续章节讲解)
3.函数必须先定义后使用
"""
"""
def check(date):

    count = 0
    for i in date:
        if i == 'a':
            count += 1
    print(f"{date}中有{count}个a")


a = "jbdfjhafhuajhnda"
check(a)
"""

# 函数的导入参数
"""
传入参数的功能是:在函数进行计算的时候，接受外部(调用时)提供的数据
def add(a, b, c):
    result = a + b + c
    print(f"{a}加{b}的结果为{resule}")

add(5,6,6)

函数定义中，提供的x和y，称之为:形式参数(形参)，表示函数声明将要使用2个参数参数之间使用逗号进行分隔
函数调用中，提供的5和6，称之为:实际参数(实参)表示函数执行时真正使用的参数值传入的时候，按照顺序传入数据，使用逗号分隔

传入参数的数量是不受限制的。
    可以不使用参数
    也可以仅使用任意N个参数
# 自动查核酸

def check(a):

    print("欢迎来到黑马程序员，请出示您的健康码以及72小时核算证明，并测体温")
    if a >= 37.5:
        print("你的体温太高了，需要隔离")
    else:
        print("你的体温正常，请进")

check(37.4)
"""

# 函数的返回值定义语法
"""
def add(a, b):
    result = a + b

    return resule
r = add(44,7)
print(r)

定义两数相加的函数功能。完成功能后，会将相加的结果返回给函数调用者所以，变量r接收到了函数的执行结果。

所谓“返回值”，就是程序中的数完成事情后，最后给调用者的结果
"""

# 函数返回值None
"""
思考：如果函数没有返回语句return？那函数还有返回值吗？
答：有的
Python中有一个特殊的字面量:None，其类型是:<class'NoneType'>无返回值的函数，实际上就是返回了:None这个字面量
None表示:空的、无实际意义的意思
函数返回的None，就表示，这个函数没有返回什么有意义的内容也就是返回了空的意思。

None作为一个特殊的字面量，用于表示:空、无意义，其有非常多的应用场景。
    用在函数无返回值上（演示1）
    用在if语句上（演示2）
        在if判断中，None等同于False
        一般用在函数中主动返回None，配合if判断做相关处理  
    用于声明无内容的变量上
        定义变量，但暂时不需要变量有具体值，可以用None来代替
        name =  None

演示1
def say_hello():
    print("hello")
# 用变量去接收say_hello函数返回值
result = say_hello()
# 打印返回值
print(result)                 # 输出None
# 打印返回值类型
print(type(result))           # 输出"NoneType"

# None可以主动使用return返回，效果等同于不写return语句：
def say_kain():
    print("kevin")
    return None

result = say_kain()
# 打印返回值
print(result)

演示2
def check(age):
    if age >= 18:
        return "success"
    else:
        return None

age = int(input("请输入你的年龄："))
result = check(age)
if not result:
    print("抱歉，未成年不允许上网")
else:
    print("你可以上网，欢迎来到xxx网吧")
"""

# 函数的说明文档
"""
对函数进行说明解释，帮助更好理解函数的功能

：param 用于解释参数
：return 用于解释返回值
"""
def func(a, b):
    """
    函数说明
    :param a: 形参X的说明
    :param b: 形参Y的说明
    :return: 返回值的说明
    """
    result = a + b
    # print(f"两数相加的结果为{result}")
    return result

# 函数的嵌套调用
"""
所谓函数嵌套调用是指一个函数里面又调用了另一个函数
def func_b():
    print("--2--")

def func_a():
    print("--1--")
    func_b()                                    --1--
                                                --2--
调用函数func_a                                    --3--
func_a()

函数A中执行到调用函数B的语句，会将函数B全部执行完成后，继续执行函数A的剩余内容

"""

# 变量在函数中的作用域
"""
主要分为2类：局部变量和全局变量。
局部变量：定义在函数内部的变量，即只在函数内部生效 ，在外面不能调用函数内的变量。
        在函数体内部临时保存数据，即当函数调用完成后，则销毁局部变量。
def testA():
    num = 100
    print(num)
testA()        # 打印100
print(num)     # 报错：name 'num' is not defined  出来函数体，局部变量就不能使用 

全局变量：指的是在函数体内、外都能生效的变量
# 全局变量
num = 100
def test_a():
    print(f"test_a: {num}")
def test_b():
    # global num        可以采用global关键字将num变成全局变量
    num += 100
    print(f"test_b: {num}")
test_a()                     # 打印100
test_b()                     # 打印200
print(num)                   # 打印200

# global关键字
使用global关键字可以在函数内部声明变量为全局变量，如下代码所示
num = 100
def test_r():
    print(num)
def test_t():
    # global关键词声明num是全局变量
    global num
    num = 200
    print(num)
test_r()
test_t()
print(num)

"""

# 函数综合案例
money = 5000000
name = input("请输入你的姓名：")
# 余额查询
def query(show_header):
    if show_header:
        print("-----查询余额-----")
    print(f"{name}，你好！你的余额为：{money}元")
# 存款
def deposit(num):
    global money
    money += num
    print("----- 存款----- ")
    print(f"{name}，你好！你存款：{num}元成功")
    query(False)

# 取款
def withdrawal(num):
    global money
    money -= num
    print("----- 取款----- ")
    print(f"{name}，你好！你取款：{num}元成功")
    query(False)

# 定义主菜单函数
def main():
    print("------主菜单------")
    print(f"{name}, 你好，欢迎来到安东ATM，请选择操作")
    print("查询余额\t[输入1]")
    print("存款\t\t[输入2]")     # 提供\t制表符对其输出
    print("取款\t\t[输入3]")
    print("退出\t\t[输入4]")
    return input("请输入你的选择：")

# 设置无限循环
while True:
    keyboard_input = main()
    if keyboard_input == "1":
        query(True)
        continue   # 通过continue继续下一轮循环，一进来就返回了主菜单。
    elif keyboard_input == "2":
        num = int(input("你想要存多少钱？请输入："))
        deposit(num)
        continue
    elif keyboard_input == "3":
        num = int(input("你想要取多少钱？请输入："))
        withdrawal(num)
        continue
    else:
        print("程序退出啦")
        break    # 通过break退出循环






